package smallfrench.moteur.biblio;

import smallfrench.moteur.biblio.err.ErreurIndex;
import smallfrench.moteur.interp.RObjet;
import smallfrench.moteur.interp.err.RException;

/**
 * Chaine de caractères immuable.
 * @author antoine1023
 *
 */
public class RChaine extends RObjet {

	public final String valeur;

	public RChaine(char c) {
		super(RClasseChaine.CLASSE);
		valeur = String.valueOf(c);
	}

	public RChaine(String valeur) {
		super(RClasseChaine.CLASSE);
		this.valeur = valeur;
	}

	//--------------------------------------------------------

	@Override
	public RChaine enChaine() {
		return this;
	}

	@Override
	public boolean equals(Object objet) {
		if (objet instanceof RChaine) {
			RChaine c = (RChaine)objet;
			return c.valeur.equals(valeur);
		}
		return false;
	}

	@Override
	public RObjet getMembre(String nom) {
		return RClasseChaine.CLASSE.champs.get(nom);
	}

	@Override
	public int hashCode() {
		return valeur.hashCode();
	}

	@Override
	public RBooleen operateurEgalBase(RObjet o) {
		if (o instanceof RChaine) {
			return RBooleen.nouveau(((RChaine)o).valeur.equals(valeur));
		}
		return null;
	}

	@Override
	public RObjet operateurIndexBase(RObjet index) throws RException {

		if (! (index instanceof REntier))
			return null;

		REntier param = (REntier)index;
		int i = param.getValeurInt();
		if (i < 0 || i >= valeur.length())
			throw ErreurIndex.nouvelleException(index);

		char c = valeur.charAt(i);

		return new RChaine(String.valueOf(c));
	}

	@Override
	public RBooleen operateurInegalBase(RObjet o) {
		if (o instanceof RChaine) {
			return RBooleen.nouveau(! ((RChaine)o).valeur.equals(valeur));
		}
		return null;
	}

	@Override
	public RObjet operateurPlusBase(RObjet o){
		return new RChaine(valeur + o.toString());
	}
}
